#include "widget.h"
#include "ui_widget.h"
#include "QDebug"
#include "QMessageBox"

Widget::Widget(QWidget *parent)
    : QWidget(parent), ui(new Ui::Widget)
{
    qDebug() << "loading.....";

    //    QDateTime old_time = QDateTime::currentDateTime();
    //    QDateTime new_time;
    //    do {
    //        new_time = QDateTime::currentDateTime();
    //    } while ( old_time.secsTo ( new_time ) <= 1 );//启动延迟3s

    ui->setupUi(this);
    setWindowTitle(tr("串口助手"));

    SerialInit();
    ui->protQcomboBox->addItem("刷新");
    connect(serial, &QSerialPort::readyRead, this, &Widget::DataReceived); //接收数据
}

Widget::~Widget()
{
    delete ui;
}

void Widget::SerialInit()
{ //初始化串口
    serial = new QSerialPort();
    //==================搜索端口====================
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        serial->setPort(info); // 在对象中设置串口
        if (serial->open(QIODevice::ReadWrite))
        {                                                // 以读写方式打开串口
            ui->protQcomboBox->addItem(info.portName()); // 添加计算机中的端口
            serial->close();                             // 关闭
        }
        else
        {
            qDebug() << "串口打开失败";
        }
    }
    //==================波特率设置====================
    ui->baudQcomboBox->addItem("9600"); //显示波特率9600
    ui->baudQcomboBox->addItem("38400");
    ui->baudQcomboBox->addItem("115200");
    serial->setBaudRate(QSerialPort::Baud9600); //设置波特率9600
    //==================数据位设置====================
    ui->dataQcomboBox->addItem("8"); //显示数据位八位
    ui->dataQcomboBox->addItem("5");
    ui->dataQcomboBox->addItem("6");
    ui->dataQcomboBox->addItem("7");
    serial->setDataBits(QSerialPort::Data8); //设置数据位八位
    //==================校验位设置====================
    ui->valQcomboBox->addItem("none");        //显示校验位 无
    serial->setParity(QSerialPort::NoParity); //设置校验位 无
    //==================停止位设置====================
    ui->stopQcomboBox->addItem("1");                    //显示停止位 1
    serial->setStopBits(QSerialPort::OneStop);          //设置停止位 1
    serial->setFlowControl(QSerialPort::NoFlowControl); //制流 无
}

void Widget::RefreshSerialPort(int index)
{
    QStringList portNameList; //存储所有串口名
    if (index != 0)
    {
        serial->setPortName(ui->protQcomboBox->currentText()); //设置串口号
    }
    else
    {
        ui->protQcomboBox->clear(); //清空串口号                                       //添加刷新
        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
        { //添加新串口
            portNameList.append(info.portName());
        }

        ui->protQcomboBox->addItems(portNameList);
        ui->protQcomboBox->setCurrentIndex(1);                 // 当前串口号为COM1
        serial->setPortName(ui->protQcomboBox->currentText()); //设置串口号
        ui->protQcomboBox->addItem("刷新");
    }
}

void Widget::DataSend()
{
    serial->write(ui->txQtextEdit->toPlainText().toLatin1()); //串口发送数据  toPlainText简单多行文本框  QString转QByteArray toLatin1转换ASCII、
    serial->write("\r\n");
}
void Widget::DataReceived()
{
    char BUF[512] = {0};                 // 存储转换类型后的数据
    QByteArray data = serial->readAll(); // 读取数据
    if (!data.isEmpty())
    {                                                 // 接收到数据
        QString str = ui->rxQtextEdit->toPlainText(); // 返回纯文本
        str += tr(data);                              // 数据是一行一行传送的，要保存所有数据
        ui->rxQtextEdit->clear();                     // 清空之前的数据
        ui->rxQtextEdit->append(str);                 // 将数据放入控件中
        // qDebug() << "str info: " << ui->rxQtextEdit->toPlainText();
        int index = str.indexOf("\r\n"); //找到，返回索引值，找不到，返回-1
        if (index != -1)
        {
            snprintf(BUF, 500, "%s", str.left(index + 2).toUtf8().data()); // QString转为char * 类型
            //qDebug() << "BUF info: " << BUF;
            str.remove(0, index + 2);
        }
    }
}

void Widget::on_openQpushButton_clicked()
{ //打开、关闭串口
    if (serial->isOpen())
    {                    //如果已打开
        serial->clear(); //清空关闭
        serial->close();
        ui->openQpushButton->setText("打开串口");
        ui->openQpushButton->setStyleSheet("color: black;");
    }
    else
    { //如果处于未打开状态

        serial->setBaudRate(ui->baudQcomboBox->currentText().toInt()); //设置波特率
        serial->setDataBits(QSerialPort::Data8);

        serial->setPortName(ui->protQcomboBox->currentText());
        if (!serial->open(QIODevice::ReadWrite))
        {
            QMessageBox::warning(this, tr("提示"), tr("串口打开失败!"), QMessageBox::Ok);
            return;
        }
        else
        {
            ui->openQpushButton->setText("关闭串口");
            ui->openQpushButton->setStyleSheet("color: red;");
        }
    }
}

void Widget::on_protQcomboBox_currentTextChanged(const QString &arg1)
{
    if (arg1 == "刷新")
    {
        // qDebug() <<  arg1;
        RefreshSerialPort(0);
    }
}
void Widget::on_sendQpushButton_clicked()
{
    DataSend();
    //qDebug() << "TXed";
}
void Widget::on_cleanQpushButton_clicked()
{
    ui->rxQtextEdit->clear();
}
